Простое
Не шифровать
Плюсы
- просто
Минусы
- при любой утечке БД -> катастрофа
Шифрование
Шифрование – обратимое преобразование данных, которое делает их не читаемыми без специального ключа
Пароль - Алгоритм шифроания с ключом - шифр
Плюсы
-
просто
-
можно расшифровать
Минусы
- можно расшифровать при утечке ключа
Пример
Хэширование
Хэш-функция - алгоритм, который превращает данные в короткую строку фиксированной длинны
Плюсы
-
обратно получить пароль невозможно
-
быстро
Минусы
-
можно быстро подбирать. MD5, SHA-1 создавались не для паролей, а для проверки целостности данных
-
Радужные таблицы хорошо ломают популярные хэши без соли
-
Одинаковые хэши у одинаковых паролей – проще подобрать пароль
Радужные таблицы – огромные БД заранее вычесленных хэшей
Пример
password123 -> ef92b778bafe771e89245b89ecbc08a44a4e166c06659911881f383d4473e94f
Соль + Глобальная соль + хэширование
- Соль (salt) - случайная строка, которую добавляют к паролю перед хэшированием, чтобы одинаковые пароли давали разные хэши (радужные таблицы не работают).
Соль хранится открыто в БД - это нормально.
- Глобальная соль (pepper) - одна общая строка, которую добавляют ко всем паролям, чтобы усложнить перебор.
Хранится в конфиге или в другом сервисе, а не в БД рядом с паролем.
- Хэширование хэша - чтобы сделать вычисление медленнее.
Но современный GPU всё равно такое посчитает относительно быстро.
Плюсы
Минусы
- есть методики обхода - это устаревшие подходы
KDF
В идеале, для паролей вместо хэширования нужны специальные функции – KDF (Key Derivation Function).
Главные требования к KDF:
-
Медленность (искусственная растяжка) - например, bcrypt 100мс на один пароль;
-
Сложность для GPU/ASIC (memory-hard) - слабое место у GPU и ASIC - это операции, требующие много памяти, поэтому алгоритм должен требовать много памяти;
-
Обязательная соль - одинаковые пароли теперь имеют разный хэш, радужные таблицы не работают:
-
Стабильность и стандартизация - стандарты RFC, NIST, поддерживаемость библиотеками на разных языках и т.
Варианты KDF-алгоритмов:
-
Argon2id:
- Защищён от GPU
- Нагрузка задаётся памятью (например, 64-256 МБ)
- Время вычисления можно регулировать
- Стандарт на 2025год
-
PBKDF2-HMAC-SHA256:
- Медленный и стабильный
- FIPS-совместимый, часто используется в enterprise - сертефицированный стандарт для корпоративных и государственных систем
- Более слабый, чем Argon2, но всё ещё надёжный
- Много раз повторяет HMAC-SHA256 - десятки или сотни тысяч раз для замедления подбора
- Немножко слабее Argon2id тк не Memory hard
-
bcrypt:
- Исторический стандарт, всё ещё приемлем, но устаревает из-за слабой защиты от GPU
-
scrypt:
- Тоже memory-hard, но менее популярен
- Сложнее настраивать
Плюсы
- злоумышленник вместо миллионов подборов будет генерировать 10-100 в секунду
Минусы
Рекомендации
-
Используем Argon2id и другие KDF:
- Параметры:
- Память: 64-256 МБ
- Параллелизм: 1-4
- Итерации: 2-4
- Параметры:
-
Храним соль вместе с хэшем:
- Соль - не секрет.
- Генерируем минимум 16 байт криптостойким генератором.
-
Опционально используем глобальную соль:
- Храним в конфиге или KMS, но не как замену соли, а как дополнительный слой.
-
Стараемся не использовать MD5 / SHA1 /SHA256 / SHA512 для паролей - даже с солью это устаревшая практика.
-
Ставим Rate limit на вход, чтобы ограничить попытки при онлайн-атаке.